/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Model;

import Aleatorio.Distribuciones.GeneradorAleatorio;
import Aleatorio.Distribuciones.GeneradorUniforme;
import Model.Semana;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Driv
 */
public class Controller {
    
    public static final int pedidoFijo = 1;
    public static final int pedidoFaltante = 2;
    private int cantSemanas;
    private int stockInicial;
    private int stockMinimo;
    private float kOrden;
    private float kMantenimiento;
    private float kStockOut;
    private int tamanoPedido;
    private int politicaPedido;
    private GeneradorAleatorio generadorDemandanda;
    private GeneradorAleatorio generadorPedido;
    private ArrayList<Semana> resultado;
    private GeneradorValores genDemanda;
    private GeneradorValores genTiempoPedido;
    private int atributoNulo;

    private int stockActual;
    private int semanaActual;
    private int tFaltanteLlegadaPedido;
    private int tamanoProximoPedido;


    public static void main(String[] args) {
        Controller c = new Controller();
        c.crearSimulacion(12, 15, 8, 50, 5, 8, 00, 00, Controller.pedidoFaltante, 15);
        c.start();
        System.out.println(c.resultado.toString() + "hola");
    }

    public void crearSimulacion (int cantSemanas, int stockInicial, int stockMinimo,
            float kOrden, float kMantenimiento, float kStockOut, int semillaDemanda, int semillaPedido, int politicaPedido, int tamanoPedido){
        this.cantSemanas = cantSemanas;
        this.generadorDemandanda = new GeneradorUniforme(semillaPedido);
        this.generadorPedido = new GeneradorUniforme(semillaDemanda);
        this.stockInicial = stockInicial;
        this.stockMinimo = stockMinimo;
        this.kMantenimiento = kMantenimiento;
        this.kOrden = kOrden;
        this.kStockOut = kStockOut;
        this.tamanoPedido = tamanoPedido;
        this.politicaPedido = politicaPedido;

        /*this.generadorDemandanda = new RandomFruta(" "); //TODO borrar!
        this.generadorPedido = new RandomFruta(null); //TODO borrar!!*/


        double valD[] ={3,4,5,6,7};
        double probD[] ={0.06,0.13,0.21,0.27,0.33};
        genDemanda = new GeneradorValores(valD,probD);

        double valP[] = {1d, 2d, 3d};
        double probP[] = {0.43d, 0.32d, 0.25d};
        genTiempoPedido = new GeneradorValores(valP, probP);

    }

    public Semana[] start(){
        stockActual = stockInicial;
        tFaltanteLlegadaPedido = -1;

        resultado = new ArrayList<Semana>();

        resultado.add(new Semana(0,0,0,stockInicial,stockInicial,0,0,0,0f,0f,0f));
        for (int i = 0; i < cantSemanas; i++) {
            semanaActual = i + 1;

            resultado.add(generarSemana());

            tFaltanteLlegadaPedido--;
        }
        Object[] o = resultado.toArray();
        Semana[] s = new Semana[o.length];
        for (int i = 0; i < o.length; i++) {
             s[i ]= (Semana) o[i];

        }
        return s;
    }

    private Semana generarSemana(){
        int idSemana;
        int demanda;
        int vendido;
        int stockInicial;
        int stockFinal;
        int pedido = 0;
        int arribo = 0;
        int demora = 0;
        float kOrden = 0;
        float kMantenimiento;
        float kStockOut = 0;

        // se registra la llegada del pedido si es que llega alguno
        if(tFaltanteLlegadaPedido == 0){
            arribo = tamanoProximoPedido;
            stockActual = stockInicial = stockActual + arribo;
        }
        else stockInicial = stockActual;
        
        // se genera la demanda
        demanda = (int) genDemanda.mostrarValor(generadorDemandanda.siguiente());

        // actualizamos el stock con lo que vendemos
        stockActual -= demanda;
        if (stockActual < 0){
            vendido = demanda + stockActual; // el stock actual es negativo
            kStockOut = -stockActual * this.kStockOut; // acá tmb el stock actual es negativo
            stockActual = 0;
        }
        else vendido = demanda;

        //calculamos el costo de mantenimiento
        kMantenimiento = stockActual*this.kMantenimiento;

        // vemos si hace falta generar un nuevo pedido y lo generams
        if (stockActual < stockMinimo && tFaltanteLlegadaPedido <= 0){
            demora = tFaltanteLlegadaPedido = demora = (int) genTiempoPedido.mostrarValor(generadorPedido.siguiente());
            pedido = tamanoProximoPedido = generarTamanoPedido();
            kOrden = this.kOrden;
        }

        stockFinal =  stockActual;


        idSemana = semanaActual;




        return new Semana(idSemana, demanda, vendido, stockInicial, stockFinal, pedido, arribo, demora, kOrden, kMantenimiento, kStockOut);
    }


    private int generarTamanoPedido() {
        
            switch (politicaPedido){
                case 1: return tamanoPedido;
                case 2: return tamanoPedido - stockActual;
            }
        
        return 0;
    }

    public double getTotal(){
        double acum = 0;
        for (Semana semana : resultado) {
            acum += semana.getCostoTotal();
        }
        return acum;
    }


}
